#define _CRT_SECURE_NO_WARNINGS 1
#include"SList.h"

//开结点
SListNode* BuySListNode(SListDataType x)
{
	SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));
	//malloc出来是这块空间，这块空间的地址就放在newNode这个指针变量里
	if (newNode == NULL)
	{
		perror("newNode:\n");
		return -1;
	}
	newNode->data = x;
	newNode->next = NULL;//不置空为随机值，系统会以为是下一个结点的地址
	//等一跳过去就越界了
	return newNode;
}


void SListPrint(SListNode* phead)
{
	//找尾
	SListNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL");
}


//得用二级指针来才能改变pList指针的地址
//尾插
void SListPushBack(SListNode** pphead, SListDataType x)
{
	SListNode* newNode = BuySListNode(x);//创建一个结点
	if (*pphead == NULL)
	{
		*pphead = newNode;
	}
	else
	{
		//找尾
		SListNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newNode;
	}
}


//尾删
void SListPopBack(SListNode** pphead)
{
	//分三种情况
	//1.空
	//2.一个结点
	//3.一个结点以上
	if (*pphead == NULL)
	{
		return -1;
	}
	else if ((*pphead)->next==NULL)
	{
		//那么要删去的就是*pphead这个结点
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SListNode* tail = *pphead;
		//再定义一个指针变量指向尾的前一个
		SListNode* prev = NULL;
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}
		free(tail);
		tail = NULL;
		//tail是这里的局部变量，不需要置成空
		// 因为出来这个函数其他人拿不到
		//把新的尾的指针置成空
		prev->next = NULL;
	}
}



//头插
void SListPushPront(SListNode** pphead, SListDataType x)
{
	SListNode* newNode = BuySListNode(x);
	/*if (*pphead == NULL)
	{
		*pphead = newNode;
	}
	else
	{
		SListNode* head = *pphead;
		*pphead = newNode;
		newNode->next = head;
	}*/
	//老师写的,不用另外考虑*pphead位NULL的情况
	newNode->next = *pphead;
	//因为若*pphead为空，这样正好让newNode->next指向空指针了
	*pphead = newNode;

}


//头删
void SListPopPront(SListNode** pphead)
{
	if (*pphead == NULL)
	{
		return -1;
	}
	//else if ((*pphead)->next == NULL)
	//{
	//	//那么要删去的就是*pphead这个结点
	//	free(*pphead);
	//	*pphead = NULL;
	//}
	//else
	//{
	//	SListNode* head = *pphead;
	//	SListNode* prev = head->next;
	//	free(head);
	//	*pphead = prev;
	//}
	
	//也可以合并来
	else
	{
		//这里如果上面没有去分析*pphead为空指针的情况
		//那么这里的(*pphead)->next就是一定为空指针了
		SListNode* next = (*pphead)->next;
		free(*pphead);
		*pphead = next;

	}
}


//查找
SListNode* SListFind(SListNode* phead, SListDataType x)
{
	SListNode* cur = phead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL; 
}



//中间插入
void SListInsertAfter(SListNode* pos, SListDataType x)
{
	assert(pos);
	SListNode* newnode = BuySListNode(x);
	SListNode* next = pos->next;
	pos = newnode;
	newnode->next = next;
}



//中间删除
void SListEraseAfter(SListNode* pos)
{
	assert(pos);
	SListNode* cur = pos;
	//先判断这个要删除的结点后面位置不为空
	if (pos->next)
	{
		SListNode* next = pos->next;
		SListNode* nextnext = next->next;
		pos->next = nextnext;
		free(next);
	}
	

}